Nested VMX: Emulation of guest VMPTRST
authorEddie Dong <eddie.dong@intel.com>
Thu, 9 Jun 2011 08:24:09 +0000 (16:24 +0800)
committerEddie Dong <eddie.dong@intel.com>
Thu, 9 Jun 2011 08:24:09 +0000 (16:24 +0800)
Signed-off-by: Qing He <qing.he@intel.com>
Signed-off-by: Eddie Dong <eddie.dong@intel.com>
Acked-by: Tim Deegan <Tim.Deegan@citrix.com>
Committed-by: Tim Deegan <Tim.Deegan@citrix.com>
xen/arch/x86/hvm/vmx/vmx.c
xen/arch/x86/hvm/vmx/vvmx.c
xen/include/asm-x86/hvm/vmx/vvmx.h

index cbd847910e28995873ac91ec2db56178d9f4ad0f..574a6a2f2e586d5aaa717bd4e0f43a0775c2139f 100644 (file)
@@ -2444,11 +2444,15 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
             update_guest_eip();
         break;
 
+    case EXIT_REASON_VMPTRST:
+        if ( nvmx_handle_vmptrst(regs) == X86EMUL_OKAY )
+            update_guest_eip();
+        break;
+
     case EXIT_REASON_MWAIT_INSTRUCTION:
     case EXIT_REASON_MONITOR_INSTRUCTION:
     case EXIT_REASON_VMCLEAR:
     case EXIT_REASON_VMLAUNCH:
-    case EXIT_REASON_VMPTRST:
     case EXIT_REASON_VMREAD:
     case EXIT_REASON_VMRESUME:
     case EXIT_REASON_VMWRITE:
index ab5718f5b5c8bd08c5985e4d22b7d6d34de1dba5..12004cb8498c8e32374969fe75c774138edd4321 100644 (file)
@@ -456,3 +456,25 @@ out:
     return X86EMUL_OKAY;
 }
 
+int nvmx_handle_vmptrst(struct cpu_user_regs *regs)
+{
+    struct vcpu *v = current;
+    struct vmx_inst_decoded decode;
+    struct nestedvcpu *nvcpu = &vcpu_nestedhvm(v);
+    unsigned long gpa = 0;
+    int rc;
+
+    rc = decode_vmx_inst(regs, &decode, &gpa, 0);
+    if ( rc != X86EMUL_OKAY )
+        return rc;
+
+    gpa = nvcpu->nv_vvmcxaddr;
+
+    rc = hvm_copy_to_guest_virt(decode.mem, &gpa, decode.len, 0);
+    if ( rc != HVMCOPY_okay )
+        return X86EMUL_EXCEPTION;
+
+    vmreturn(regs, VMSUCCEED);
+    return X86EMUL_OKAY;
+}
+
index 70d2b3374a102ac2e50e5416be6e56edeb8bf7c0..fbe34ab0345f4cb5248347acc0c15a5ef03edf77 100644 (file)
@@ -154,6 +154,7 @@ void __set_vvmcs(void *vvmcs, u32 vmcs_encoding, u64 val);
 
 void nvmx_destroy_vmcs(struct vcpu *v);
 int nvmx_handle_vmptrld(struct cpu_user_regs *regs);
+int nvmx_handle_vmptrst(struct cpu_user_regs *regs);
 
 #endif /* __ASM_X86_HVM_VVMX_H__ */